home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / plan / src / keymenu.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  9KB  |  284 lines

  1. /*
  2.  * Create and destroy the keyword search popup. It is installed when the
  3.  * Keyword Search entry in the Seach pulldown in the main calendar window
  4.  * is used.
  5.  *
  6.  *    destroy_keyword_popup()
  7.  *    create_keyword_popup()
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <time.h>
  12. #include <Xm/Xm.h>
  13. #include <Xm/DialogS.h>
  14. #include <Xm/Form.h>
  15. #include <Xm/RowColumn.h>
  16. #include <Xm/LabelP.h>
  17. #include <Xm/LabelG.h>
  18. #include <Xm/PushBP.h>
  19. #include <Xm/PushBG.h>
  20. #include <Xm/ToggleB.h>
  21. #include <Xm/Text.h>
  22. #include <Xm/Protocols.h>
  23. #include "cal.h"
  24.  
  25. extern void help_callback();
  26. static void mode_callback(), text_callback(),
  27.         search_callback(), done_callback();
  28.  
  29. extern Display        *display;    /* everybody uses the same server */
  30. extern struct config    config;        /* global configuration data */
  31. extern struct list    *mainlist;    /* list of all schedule entries */
  32. extern Pixel        color[NCOLS];    /* colors: COL_* */
  33.  
  34. static BOOL        have_shell;    /* message popup exists if TRUE */
  35. static Widget        shell;        /* popup menu shell */
  36. static Widget        text;        /* search string */
  37. static char        *search_string;    /* string to search for */
  38. int            search_mode=1;    /* 0=case sensitive, 1=ins., 2=regex */
  39.  
  40.  
  41. /*
  42.  * destroy a popup. Remove it from the screen, and destroy its widgets.
  43.  * It's too much trouble to keep them for next time.
  44.  */
  45.  
  46. destroy_keyword_popup()
  47. {
  48.     if (have_shell) {
  49.         if (search_string)
  50.             XtFree(search_string);
  51.         search_string = XmTextGetString(text);
  52.         XtPopdown(shell);
  53.         have_shell = FALSE;
  54.     }
  55. }
  56.  
  57.  
  58. /*
  59.  * create a keyword popup as a separate application shell. When the popup
  60.  * already exists and was just popped down, pop it up and exit. This ensures
  61.  * that it comes up with the same defaults.
  62.  */
  63.  
  64. create_keyword_popup()
  65. {
  66.     Widget            form, radio, w;
  67.     Arg            args[20];
  68.     int            n;
  69.     Atom            closewindow;
  70.  
  71.     if (have_shell) {
  72.         XtPopup(shell, XtGrabNone);
  73.         return;
  74.     }
  75.     n = 0;
  76.     XtSetArg(args[n], XmNdeleteResponse,    XmDO_NOTHING);        n++;
  77.     XtSetArg(args[n], XmNiconic,        False);            n++;
  78.     shell = XtAppCreateShell("Keyword Search", "plan",
  79.             applicationShellWidgetClass, display, args, n);
  80. #    ifdef EDITRES
  81.     XtAddEventHandler(shell, (EventMask)0, TRUE, 
  82.              _XEditResCheckMessages, NULL);
  83. #    endif
  84.     set_icon(shell, 1);
  85.     form = XtCreateManagedWidget("keyform", xmFormWidgetClass,
  86.             shell, NULL, 0);
  87.     XtAddCallback(form, XmNhelpCallback, help_callback, (XtPointer)"key");
  88.  
  89.                             /*-- mode --*/
  90.     n = 0;
  91.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  92.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  93.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  94.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  95.     w = XtCreateManagedWidget("Search mode:", xmLabelWidgetClass,
  96.             form, args, n);
  97.     n = 0;
  98.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_FORM);        n++;
  99.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  100.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_WIDGET);    n++;
  101.     XtSetArg(args[n], XmNleftWidget,    w);            n++;
  102.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  103.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  104.     XtSetArg(args[n], XmNspacing,        4);            n++;
  105.     radio = XmCreateRadioBox(form, "radio", args, n);
  106.  
  107.     n = 0;
  108.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  109.     XtSetArg(args[n], XmNindicatorType,    XmONE_OF_MANY);        n++;
  110.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  111.     XtSetArg(args[n], XmNset,        False);            n++;
  112.     w = XtCreateManagedWidget("Literal case sensitive",
  113.             xmToggleButtonWidgetClass,
  114.             radio, args, n);
  115.     XtAddCallback(w, XmNvalueChangedCallback, mode_callback, (XtPointer)0);
  116.     XtAddCallback(w, XmNhelpCallback, help_callback,
  117.                         (XtPointer)"key_literal");
  118.  
  119.     n = 0;
  120.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  121.     XtSetArg(args[n], XmNindicatorType,    XmONE_OF_MANY);        n++;
  122.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  123.     XtSetArg(args[n], XmNset,        True);            n++;
  124.     w = XtCreateManagedWidget("Literal case insensitive",
  125.             xmToggleButtonWidgetClass,
  126.             radio, args, n);
  127.     XtAddCallback(w, XmNvalueChangedCallback, mode_callback, (XtPointer)1);
  128.     XtAddCallback(w, XmNhelpCallback, help_callback,
  129.                         (XtPointer)"key_uncase");
  130.  
  131. #ifndef NOREGEX
  132.     n = 0;
  133.     XtSetArg(args[n], XmNselectColor,    color[COL_TOGGLE]);    n++;
  134.     XtSetArg(args[n], XmNindicatorType,    XmONE_OF_MANY);        n++;
  135.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  136.     XtSetArg(args[n], XmNset,        False);            n++;
  137.     w = XtCreateManagedWidget("Regular expression",
  138.             xmToggleButtonWidgetClass,
  139.             radio, args, n);
  140.     XtAddCallback(w, XmNvalueChangedCallback, mode_callback, (XtPointer)2);
  141.     XtAddCallback(w, XmNhelpCallback, help_callback,
  142.                         (XtPointer)"key_regular");
  143. #endif
  144.  
  145.     XtManageChild(radio);
  146.                             /*-- search string --*/
  147.     n = 0;
  148.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  149.     XtSetArg(args[n], XmNtopWidget,        radio);            n++;
  150.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  151.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  152.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  153.     w = XtCreateManagedWidget("Search for:", xmLabelWidgetClass,
  154.             form, args, n);
  155.     XtAddCallback(w, XmNhelpCallback, help_callback,
  156.                         (XtPointer)"key_string");
  157.  
  158.     n = 0;
  159.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  160.     XtSetArg(args[n], XmNtopWidget,        w);            n++;
  161.     XtSetArg(args[n], XmNtopOffset,        5);            n++;
  162.     XtSetArg(args[n], XmNleftAttachment,    XmATTACH_FORM);        n++;
  163.     XtSetArg(args[n], XmNleftOffset,    16);            n++;
  164.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  165.     XtSetArg(args[n], XmNrightOffset,    16);            n++;
  166.     XtSetArg(args[n], XmNrecomputeSize,    False);            n++;
  167.     XtSetArg(args[n], XmNpendingDelete,    True);            n++;
  168.     XtSetArg(args[n], XmNhighlightThickness,0);            n++;
  169.     XtSetArg(args[n], XmNbackground,    color[COL_TEXTBACK]);    n++;
  170.     text = XtCreateManagedWidget("", xmTextWidgetClass,
  171.             form, args, n);
  172.     XtAddCallback(text, XmNactivateCallback, text_callback,
  173.                         (XtPointer)NULL);
  174.     XtAddCallback(text, XmNhelpCallback, help_callback,
  175.                         (XtPointer)"key_string");
  176.  
  177.                             /*-- buttons --*/
  178.     n = 0;
  179.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  180.     XtSetArg(args[n], XmNtopWidget,        text);            n++;
  181.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  182.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_FORM);        n++;
  183.     XtSetArg(args[n], XmNrightOffset,    16);            n++;
  184.     XtSetArg(args[n], XmNwidth,        80);            n++;
  185.     w = XtCreateManagedWidget("Search", xmPushButtonWidgetClass,
  186.             form, args, n);
  187.     XtAddCallback(w, XmNactivateCallback, search_callback, (XtPointer)0);
  188.     XtAddCallback(w, XmNhelpCallback, help_callback,
  189.                         (XtPointer)"key_search");
  190.  
  191.     n = 0;
  192.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  193.     XtSetArg(args[n], XmNtopWidget,        text);            n++;
  194.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  195.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  196.     XtSetArg(args[n], XmNrightWidget,    w);            n++;
  197.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  198.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  199.     XtSetArg(args[n], XmNbottomOffset,    16);            n++;
  200.     XtSetArg(args[n], XmNwidth,        80);            n++;
  201.     w = XtCreateManagedWidget("Cancel", xmPushButtonWidgetClass,
  202.             form, args, n);
  203.     XtAddCallback(w, XmNactivateCallback, done_callback, (XtPointer)0);
  204.     XtAddCallback(w, XmNhelpCallback, help_callback,
  205.                         (XtPointer)"key_cancel");
  206.  
  207.     n = 0;
  208.     XtSetArg(args[n], XmNtopAttachment,    XmATTACH_WIDGET);    n++;
  209.     XtSetArg(args[n], XmNtopWidget,        text);            n++;
  210.     XtSetArg(args[n], XmNtopOffset,        16);            n++;
  211.     XtSetArg(args[n], XmNrightAttachment,    XmATTACH_WIDGET);    n++;
  212.     XtSetArg(args[n], XmNrightWidget,    w);            n++;
  213.     XtSetArg(args[n], XmNrightOffset,    8);            n++;
  214.     XtSetArg(args[n], XmNbottomAttachment,    XmATTACH_FORM);        n++;
  215.     XtSetArg(args[n], XmNbottomOffset,    16);            n++;
  216.     XtSetArg(args[n], XmNwidth,        80);            n++;
  217.     w = XtCreateManagedWidget("Help", xmPushButtonWidgetClass,
  218.             form, args, n);
  219.     XtAddCallback(w, XmNactivateCallback, help_callback, (XtPointer)"key");
  220.     XtAddCallback(w, XmNhelpCallback,     help_callback, (XtPointer)"key");
  221.  
  222.     XtPopup(shell, XtGrabNone);
  223.     closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
  224.     XmAddWMProtocolCallback(shell, closewindow,
  225.                     done_callback, (XtPointer)shell);
  226.  
  227.     have_shell = TRUE;
  228. }
  229.  
  230.  
  231. /*-------------------------------------------------- callbacks --------------*/
  232. /*
  233.  * All of these routines are direct X callbacks.
  234.  */
  235.  
  236. /*ARGSUSED*/
  237. static void mode_callback(widget, item, data)
  238.     Widget                widget;
  239.     int                item;
  240.     XmToggleButtonCallbackStruct    *data;
  241. {
  242.     search_mode = item;
  243. }
  244.  
  245.  
  246. /*ARGSUSED*/
  247. static void done_callback(widget, item, data)
  248.     Widget                widget;
  249.     int                item;
  250.     XmToggleButtonCallbackStruct    *data;
  251. {
  252.     destroy_keyword_popup();
  253. }
  254.  
  255.  
  256. /*ARGSUSED*/
  257. static void search_callback(widget, item, data)
  258.     Widget                widget;
  259.     int                item;
  260.     XmToggleButtonCallbackStruct    *data;
  261. {
  262.     if (search_string)
  263.         XtFree(search_string);
  264.     search_string = XmTextGetString(text);
  265.     if (*search_string)
  266.         create_list_popup(mainlist, (time_t)0, (time_t)0,
  267.                     search_string, (struct entry *)0);
  268. }
  269.  
  270.  
  271. /*ARGSUSED*/
  272. static void text_callback(widget, item, data)
  273.     Widget                widget;
  274.     int                item;
  275.     XmToggleButtonCallbackStruct    *data;
  276. {
  277.     if (search_string)
  278.         XtFree(search_string);
  279.     search_string = XmTextGetString(widget);
  280.     if (*search_string)
  281.         create_list_popup(mainlist, (time_t)0, (time_t)0,
  282.                     search_string, (struct entry *)0);
  283. }
  284.